home *** CD-ROM | disk | FTP | other *** search
- /* * This file forms part of CorVu dbCGI * * CorVu dbCGI is Copyright (C) 1995 CorVu Pty Ltd. * Written by Troy Rollo * * CorVu dbCGI is free software. It may be modified and redistributed under * the terms of the CorVu General Public License, either version 1, or, at * your option, any later version. Ensure that you read this license before * modifying or redistributing the software. * * THIS PROGRAM IS PROVIDED "AS IS" WITH NO WORRANTY OF ANY KIND. YOU USE * THIS PROGRAM ENTIRELY AT YOUR OWN RISK. NEITHER CORVU, NOR ANY OTHER * PARTY MAY BE HELD RESPONSIBLE FOR ANY DAMAGES ARISING FROM YOUR USE OR * MISUSE OF THIS PROGRAM. */#include "dbcgi.h"#include "oracle.h"typedef struct __dbw_conninfo{ struct ldadef lda; struct crsdef cursor;} dbw_conninfo;static dbw_typemap atm[] ={ { ORA_CHARACTER, 0, ORA_NTS, DBWT_Char }, { ORA_NEW_CHAR, 0, ORA_NTS, DBWT_Char }, { ORA_MLSLABEL, 257, ORA_NTS, DBWT_Char }, { ORA_LONG, -1, ORA_NTS, DBWT_Char }, { ORA_ROWID, 20, ORA_NTS, DBWT_Char }, { ORA_DATE, 9, ORA_NTS, DBWT_Char }, { ORA_RAW, -1, ORA_LONG_VARRAW,DBWT_Raw_Lidx }, { ORA_LONG_RAW, -1, ORA_LONG_VARRAW,DBWT_Raw_Lidx }, { ORA_NUMBER, 0, ORA_DOUBLE, DBWT_Float }};void SendErrorMessage(char *achSQL, short iCode, dbw_conninfo *pinfo){ static char achError[512]; oerhms(&pinfo->lda, (sb2) iCode, achError, (sword) sizeof(achError)); FormatErrors(iCode, achError, achSQL);}static void RunQuery(dbw_value *pval, int iGetResults){ int iColumn; int nColumns; char *pchCommand = GetValue(pval, "Query"); sb2 iStrLen; sb4 iColumnWidth; sb2 iColType; sb2 iDummy2; char achColumnName[256]; dbw_result *prslt; short *piIndicators; dbw_bindinfo *pbi; dbw_conninfo *pinfo = FindConnection(pval); if (!pinfo) return; osql3(&pinfo->cursor, pchCommand, strlen(pchCommand)); if (!pinfo->cursor.Return_Code) oexec(&pinfo->cursor); if (pinfo->cursor.Return_Code) { SendErrorMessage(pchCommand, pinfo->cursor.Return_Code, pinfo); FreeString(pchCommand); return; } FreeString(pchCommand); if (!iGetResults) return; for (nColumns = 0;; nColumns++) { odsc(&pinfo->cursor, nColumns + 1, &iDummy2, &iDummy2, &iDummy2, &iColType, (char *) 0, (sb2 *) 0, &iDummy2); if (pinfo->cursor.Return_Code) { pinfo->cursor.Return_Code = 0; break; } } prslt = new2(dbw_result, nColumns); piIndicators = new2(short, nColumns); for (iColumn = 0; iColumn < nColumns; iColumn++) { iStrLen = sizeof(achColumnName) - 1; odescr(&pinfo->cursor, iColumn + 1, &iDummy2, &iDummy2, &iDummy2, &iColType, achColumnName, &iStrLen, &iColumnWidth, &iDummy2); achColumnName[iStrLen] = 0; pbi = FindColInfo(atm, rangeof(atm), &prslt[iColumn], achColumnName, iColType, iColumnWidth, -1); odefin(&pinfo->cursor, iColumn + 1, pbi->pchData, pbi->iWidth, pbi->iBindType, -1, piIndicators + iColumn, (char *) 0, -1, -1, (short *) 0, (short *) 0); } FormatHeadings(prslt, nColumns); while (!ofetch(&pinfo->cursor)) { for (iColumn = 0; iColumn < nColumns; iColumn++) prslt[iColumn].iIsNull = (piIndicators[iColumn] < 0); FormatOutput(prslt, nColumns); } if (pinfo->cursor.Return_Code != 1403) SendErrorMessage("Fetching data", pinfo->cursor.Return_Code, pinfo); ocan(&pinfo->cursor);}voidDBQuery(dbw_value *pval){ RunQuery(pval, 1);}voidDBExecute(dbw_value *pval){ RunQuery(pval, 0);}static char hda[256];voidDBDisconnect(dbw_value *pval){ dbw_conninfo *pinfo = FindConnection(pval); if (!pinfo) return; ologof(&pinfo->lda); DropConnection(pval);}voidDBInit(dbw_value *pval){ char *pchSID = GetValue(pval, "ORACLE_SID"); char *pchTwoTask = GetValue(pval, "TWO_TASK"); char *pchOraHome = GetValue(pval, "ORACLE_HOME"); int i; PutEnvVar("ORACLE_SID", pchSID); PutEnvVar("TWO_TASK", pchTwoTask); PutEnvVar("ORACLE_HOME", pchOraHome); FreeString(pchSID); FreeString(pchTwoTask); FreeString(pchOraHome); for (i = 0; i < sizeof(atm); i++) if (atm[i].iSize == -1) atm[i].iSize = nMaxBlob;}voidDBUnInit(dbw_value *pval){}voidDBConnect(dbw_value *pval){ char *pchUser = GetValue(pval, "USER"); char *pchPass = GetValue(pval, "PASS"); char *pchConnString = GetValue(pval, "CONN_STR"); char achConnString[256]; dbw_conninfo *pinfo = new(dbw_conninfo); if (!AddConnection(pval, pinfo)) { free(pinfo); return; } if (pchConnString) { sprintf(achConnString, "%s@%s", pchUser, pchConnString); orlon(&pinfo->lda, hda, achConnString, -1, pchPass, -1, -1); } else { olon(&pinfo->lda, pchUser, strlen(pchUser), pchPass, strlen(pchPass), -1); } if (pinfo->lda.Return_Code) { SendErrorMessage(pchUser, pinfo->lda.Return_Code, pinfo); DropConnection(pval); } else { oopen(&pinfo->cursor, &pinfo->lda, (char *) 0, -1, -1, (char *) 0, -1); if (pinfo->lda.Return_Code) { SendErrorMessage(pchUser, pinfo->lda.Return_Code, pinfo); DropConnection(pval); } } FreeString(pchConnString); FreeString(pchUser); FreeString(pchPass);}